import axios from 'axios'
import { getCodeMsg, getErrMsgByCode } from '@/utils/open/discern'
// import { getToken } from '@/utils/auth'
import store from '@/store'
// import router from '@/router'
import $validate from '@/utils/open/validate'
// import $eltool from '@/utils/open/eltool'
import $notice from '@/utils/open/notice'
import $common from '@/utils/open/common'
// import appsetting from '@/assets/appsettings.js'
// const apiConfig = appsetting.WebApi

// let baseURL
// // 判断开发环境（一般用于本地代理）
// if (process.env.NODE_ENV === 'development') { // 开发环境
//   baseURL = apiConfig.WEBAPI_BASE_URL
// } else { // 生产环境
//   baseURL = window.APIURL.prodUrlApi
// }
// debugger
// let baseURL = window.APIURL.baseURL
let baseURL = ''
// 判断开发环境（一般用于本地代理）
if (process.env.NODE_ENV === 'development') { // 开发环境
  baseURL = window.g.WEBAPI_HOST_URL
} else { // 生产环境
  baseURL = window.g.WEBAPI_HOST_URL
}

// 特殊接口，返回结果格式与其他不一样
// const errorFilterUrl = ['connect/token', 'connect/userinfo', 'api/Ksf/KsfData/CheckXLSFile']
const errorFilterUrl = []

let _params = {}

try {
  _params = {
    errType: 2,
    pageMsg: '',
    columnNo: '',
    lineNo: '',
    stack: '',
    cod: '',
    msg: '',
    controllerAddress: '',
    // ipAddress: window.returnCitySN['cip'],
    createTime: '',
    systemType: 3,
    dbName: 'pc_error_log'
  }
} catch (err) {
  console.error('request-error-log', err)
}

// 处理 code=507
const handle507 = $common.debounce(() => {
  // alert('handle507')
  $common.clearAccountFn() // 清空用户账户数据
})
//
// 网络连接异常提示
const netWorkErrTip = $common.debounce(() => {
  $notice.tip(3, '网络异常，请检查网络连接！')
})
// 请求超时！
const timeoutErrTip = $common.debounce(() => {
  $notice.tip(3, '请求超时！')
})

/**
 * 请求前置处理
 */
axios.defaults.timeout = 30000
axios.interceptors.request.use(config => {
  config.headers['accept'] = 'application/json; charset=utf-8'
  // debugger
  // if (store.getters.token) {
  //   const token = getToken() || {}
  //   if (!$validate.isNull(token)) {
  //     config.headers['Authorization'] = 'Bearer ' + token
  //   }
  //   return config
  // }

  return config
}, function (err) {
  return Promise.reject(err)
})
/**
 * 请求后置处理
 *
 */
axios.interceptors.response.use(response => {
  // debugger
  const res = response.data
  const url = response.config.url
  // if ($common.getType(res.data) === 'object') {
  //   // debugger
  //   // test-xcs 测试阶段使用
  //   res.data.responseURL = response.request.responseURL.replace('http://47.96.81.168/WebApi/', '') // 目前用来区分接口请求，员工详情有用到
  // }
  const isNoSpecialUrl = errorFilterUrl.some(oUrl => {
    const flag = url.indexOf(oUrl) > -1
    // debugger
    return flag
  })
  // debugger
  if (response.config.headers && response.config.headers['responseType'] === 'blob') {
    setTimeout(() => {
      executeDownloadFile(response)
    }, 600)
    return response.data
  }
  // const t = getCodeMsg(res)
  // debugger
  if (!isNoSpecialUrl) { // 特殊接口，不需要判断code
    if (getCodeMsg(res)) {
      return res
    } else {
      throw new Error(JSON.stringify(res))
    }
  }
}, (err) => {
  const errMsg = err.toString()
  // debugger
  const code = errMsg.substr(errMsg.indexOf('code') + 5)
  if (!getErrMsgByCode(parseInt(code))) {
    _params.msg = errMsg
    _params.stack = '错误原因:' + errMsg + ',定位页面路由：' + window.location.hash.slice(1)
    _params.createTime = Date.now()
    if (parseInt(code) === 507) {
      // debugger
      handle507()
    }
  } else if (errMsg.indexOf('Network Error') > -1) { // 网络连接异常提示
    netWorkErrTip()
  } else if (errMsg.indexOf('timeout') > -1) { // 请求超时
    timeoutErrTip()
  }
  //
  // return Promise.reject(err)
  return Promise.reject()
})

/**
 * 下载主方法
 * @param res
 */
function executeDownloadFile(res) {
  const blob = new Blob([res.data])
  const filename = res.config.params['fileName']

  if (window.navigator.msSaveBlob) { // 判断是否是IE浏览器，是的话返回true
    try {
      window.navigator.msSaveBlob(blob, filename)
    } catch (e) {
      console.log(e)
    }
  } else { // 谷歌浏览器 创建a标签 添加download属性下载
    const url = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    link.style.display = 'none'
    link.href = url
    link.setAttribute('download', filename)
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    window.URL.revokeObjectURL(url)
  }
}

export default {
  /**
   * post download
   * @param {String} url 链接
   * @param {Array,Object} data json对象
   * @param {Object} params json对象
   * @param {String} fileName 文件名
   */
  postDownload(url, data, params, fileName) {
    const config = {
      fileName,
      headers: {
        'content-type': 'application/json; charset=utf-8',
        'responseType': 'blob'
      }

    }
    return this.download(url, 'post', data, params, config)
  },
  /**
   * get download
   * @param {String} url 链接
   * @param {Array,Object} data json对象
   * @param {Object} params json对象
   * @param {String} fileName 文件名
   */
  getDownload(url, data, params, fileName) {
    const config = {
      fileName,
      headers: {
        'content-type': 'application/x-www-form-urlencoded',
        'responseType': 'blob'
      }
    }
    return this.download(url, 'get', data, params, config)
  },
  /**
   * 小文件下载方法
   * @param url
   * @param params
   * @param fileName  下载文件的名称，包括后缀
   * @returns {*|Promise<any>}
   */
  download(url, methods, data, params, config) {
    params = params || {}
    const URL = url.indexOf('http') !== -1 ? url : baseURL + url
    const headers = config.headers || {
      'content-type': 'application/x-www-form-urlencoded',
      'esponseType': 'blob'
    }
    // const headers = {
    //   // 'content-type': 'application/x-www-form-urlencoded',
    //   'content-type': 'application/json; charset=utf-8',
    //   'responseType': 'blob'
    // }
    // debugger
    params.fileName = config.fileName
    // TODO: 没有判断code
    return new Promise((resolve, reject) => {
      axios({
        method: methods,
        baseURL: URL,
        params: params,
        data,
        headers: headers,
        responseType: 'blob' // 表明返回服务器返回的数据类型，返回数据的格式，可选值为arraybuffer,blob,document,json,text,stream，默认值为json
      }).then((res) => {
        resolve(res)
      }).catch((err) => {
        reject(err)
      })
    })
  },
  /**
   * GET 资源请求
   * 特别用于查询操作
   * @param url
   * @param params
   * @returns {*}
   */
  get(url, data, params, config) {
    // debugger
    return this.createForm(url, 'get', config, data, params)
  },
  /**
   * POST 资源请求
   * 特用于保存操作，支持DTO
   * @param url
   * @param params
   * @returns {*}
   */
  postForm(url, data, params, config) {
    return this.createJson(url, 'post', config, data, params)
  },
  /**
   * POST 资源请求
   * 特用于保存操作，支持DTO
   * @param url
   * @param params
   * @returns {*}
   */
  postJson(url, data, params, config) {
    // debugger
    config = config || {}
    config.headers = config.headers || { 'Content-Type': 'application/json; charset=utf-8' }
    return this.createJson(url, 'post', config, data, params)
  },
  /**
   * 原生请求 支持FORM表单参数提交
   * @param url
   * @param method
   * @param headers
   * @param params
   * @returns {Promise<any>}
   */
  createForm(url, method, config, data, params) {
    config = config || {}
    // debugger
    const headers = config.headers || {}
    const URL = url.indexOf('http') !== -1 ? url : baseURL + url
    // debugger
    return new Promise((resolve, reject) => {
      axios({
        method: method,
        baseURL: URL,
        params: params,
        headers: headers
      }).then((res) => {
        resolve(res)
      }).catch((err) => {
        _params.controllerAddress = URL
        reject(err)
      })
    })
  },
  /**
   * 原生请求 支持DTO 提交
   * @param url
   * @param method
   * @param headers
   * @param data
   * @param params
   * @returns {Promise<any>}
   */
  createJson(url, method, config, data, params) {
    config = config || {}
    const headers = config.headers || {}
    const URL = url.indexOf('http') !== -1 ? url : baseURL + url
    // debugger
    return new Promise((resolve, reject) => {
      axios({
        method: method,
        baseURL: URL,
        data,
        params,
        headers: headers
      }).then((res) => {
        resolve(res)
      }).catch((err) => {
        _params.controllerAddress = URL
        reject(err)
      })
    })
  }
}
